<?php
class APrestamoAExternos {

	public function __construct() {
	}

	public function generarGirosCuotas(EFacade & $facade) {

		$ezpdo_ = getManager();
		$session = $facade->session;
		$docFC = & $facade->getDocumentRoot();
		$cliente = & $docFC->cliente;
		if (!($cliente->cuenta)) {
			$cuentaCliente = $ezpdo_->create('MCuentaCliente');
			$cuentaCliente->cliente = $cliente;
		} else
			$cuentaCliente = & $cliente->cuenta;
		$cuentaCliente->commit();
		$numero = 0;
		$plazos = $docFC->plazos;
		/*********** PARA PODER TENER EL NUM DEL PRESTAMO Y PEGARSELO A LA CUOTA *******/
		$docFC->commit();
		$docFC->numero = $docFC->getDocumentNumber();
		/********************** CUENTAS A AFECTAR **********************/
		/********** EGRESO DEL DINERO PRESTADO AL CLIENTE **************/
		$totalPagado = 0;
		foreach ($docFC->formasPagoList as $formaP) {
			if ($formaP->formaPago->cuentaBancaria)
				$cta = $formaP->formaPago->cuentaBancaria->cuentaContable;
			else
				$cta = $formaP->formaPago->cuentaCaja->cuentaContable;
			$cta->disminuye($formaP->montoPago, $docFC);
			/***************** Transacciones ***************************/
			$montoImpuesto = 0;
			$montoPagado = stringToNumber($formaP->montoPago);
			$totalPagado += $montoPagado;
			if ($cuentaCaja = & $formaP->formaPago->cuentaCaja != NULL) {
				$saldoCajaViejo = $cuentaCaja->saldo;
				$sql = 'FROM MTipoTransaccion as t where t.cuentaCaja.oid = ?';
				$transacciones = $ezpdo_->find($sql, $cuentaCaja->epGetObjectId());
				$tipoTransaccion = $transacciones[0];
				$montoAumento = 0;
				if ($porcentaje = $tipoTransaccion->porcentajeComision > 0) {
					$montoNuevo = $montoPagado * $porcentaje / 100;
					$montoImpuesto -= $montoNuevo;
					$transaccion = $session->create('MTransaccion');
					$fechaTransaccion = time();
					$montoTransaccion = $montoNuevo;
					$transaccion->esCaja = TRUE;
					$transaccion->fechaTransaccion = $fechaTransaccion;
					$transaccion->montoTransaccion = $montoTransaccion;
					$transaccion->haber = $montoTransaccion;
					$transaccion->saldoCuenta = $cuentaCaja->saldo;
					$descripcion = "Comision  " . $porcentaje . " %";
					$transaccion->descripcion = $descripcion;
					$transaccion->tipoTransaccion = $tipoTransaccion;
					$transaccion->cuentaCaja = $cuentaCaja;
					$transaccion->commit();
					$facade->session->evictAll('MTransaccion');
				}
				if ($porcentaje = $tipoTransaccion->montoComision > 0) {
					$montoImpuesto -= $porcentaje;
					$transaccion = $session->create('MTransaccion');
					$fechaTransaccion = time();
					$montoTransaccion = $porcentaje;
					$transaccion->esCaja = TRUE;
					$transaccion->fechaTransaccion = $fechaTransaccion;
					$transaccion->montoTransaccion = $montoTransaccion;
					$transaccion->haber = $montoTransaccion;
					$transaccion->saldoCuenta = $cuentaCaja->saldo;
					$descripcion = "Comision  " . $porcentaje . " BsF";
					$transaccion->descripcion = $descripcion;
					$transaccion->tipoTransaccion = $tipoTransaccion;
					$transaccion->cuentaCaja = $cuentaCaja;
					$transaccion->commit();
					$facade->session->evictAll('MTransaccion');
				}
				if ($porcentaje = $tipoTransaccion->porcentajeImpuesto > 0) {
					$montoNuevo = $montoPagado * $porcentaje / 100;
					$montoImpuesto -= $montoNuevo;
					$transaccion = $session->create('MTransaccion');
					$fechaTransaccion = time();
					$montoTransaccion = $montoNuevo;
					$transaccion->esCaja = TRUE;
					$transaccion->fechaTransaccion = $fechaTransaccion;
					$transaccion->montoTransaccion = $montoTransaccion;
					$transaccion->haber = $montoTransaccion;
					$transaccion->saldoCuenta = $cuentaCaja->saldo;
					$cuentaCaja->commit();
					$descripcion = "Impuesto " . $porcentaje . " %";
					$transaccion->descripcion = $descripcion;
					$transaccion->tipoTransaccion = $tipoTransaccion;
					$transaccion->cuentaCaja = $cuentaCaja;
					$transaccion->commit();
					$facade->session->evictAll('MTransaccion');
				}
				if ($porcentaje = $tipoTransaccion->montoImpuesto > 0) {
					$montoImpuesto -= $porcentaje;
					$transaccion = $session->create('MTransaccion');
					$fechaTransaccion = time();
					$montoTransaccion = $porcentaje;
					$transaccion->esCaja = TRUE;
					$transaccion->fechaTransaccion = $fechaTransaccion;
					$transaccion->montoTransaccion = $montoTransaccion;
					$transaccion->haber = $montoTransaccion;
					$transaccion->saldoCuenta = $cuentaCaja->saldo;
					$cuentaCaja->commit();
					$descripcion = "Impuesto " . $porcentaje . " BsF";
					$transaccion->descripcion = $descripcion;
					$transaccion->tipoTransaccion = $tipoTransaccion;
					$transaccion->cuentaCaja = $cuentaCaja;
					$transaccion->commit();
					$facade->session->evictAll('MTransaccion');
				}
				$transaccion = $session->create('MTransaccion');
				$fechaTransaccion = time();
				$montoTransaccion = $montoPagado + $montoImpuesto;
				$transaccion->esCaja = TRUE;
				$transaccion->fechaTransaccion = $fechaTransaccion;
				$transaccion->montoTransaccion = $montoTransaccion;
				$transaccion->haber = $montoTransaccion;
				$transaccion->saldoCuenta = $cuentaCaja->saldo;
				if (strlen($formaP->detalle) > 0)
					$detalle = $formaP->detalle;
				else
					$detalle = " con " . $formaP->formaPago->nombre . " " . $formaP->detalle;
				$descripcion = "Pago Prestamo " . $docFP->documento->numero . $detalle;
				$transaccion->descripcion = $descripcion;
				$transaccion->tipoTransaccion = $tipoTransaccion;
				$transaccion->cuentaCaja = $cuentaCaja;
				$transaccion->documento = $docFC;
				$saldoCajaNuevo = $saldoCajaViejo - $montoPagado + $montoImpuesto;
				$cuentaCaja->saldo = $saldoCajaNuevo;
				$transaccion->saldoCuenta = $cuentaCaja->saldo;
			} else {
				$cuentaCaja = & $formaP->formaPago->cuentaBancaria;
				$saldoCajaViejo = $cuentaCaja->saldo;
				$sql = 'FROM MTipoTransaccion as t where t.cuentaBancaria.oid = ?';
				$transacciones = $ezpdo_->find($sql, $cuentaCaja->epGetObjectId());
				$tipoTransaccion = $transacciones[0];
				$montoAumento = 0;
				if ($porcentaje = $tipoTransaccion->porcentajeComision > 0) {
					$montoNuevo = $montoPagado * $porcentaje / 100;
					$montoImpuesto -= $montoNuevo;
					$transaccion = $session->create('MTransaccion');
					$fechaTransaccion = time();
					$montoTransaccion = $montoNuevo;
					$transaccion->esBanco = TRUE;
					$transaccion->fechaTransaccion = $fechaTransaccion;
					$transaccion->montoTransaccion = $montoTransaccion;
					$transaccion->haber = $montoTransaccion;
					$descripcion = "Comision  " . $porcentaje . " %";
					$transaccion->descripcion = $descripcion;
					$transaccion->tipoTransaccion = $tipoTransaccion;
					$transaccion->cuentaCaja = $cuentaCaja;
					$transaccion->saldoCuenta = $cuentaCaja->saldo;
					$transaccion->commit();
					$facade->session->evictAll('MTransaccion');
				}
				if ($porcentaje = $tipoTransaccion->montoComision > 0) {
					$montoImpuesto -= $porcentaje;
					$transaccion = $session->create('MTransaccion');
					$fechaTransaccion = time();
					$montoTransaccion = $porcentaje;
					$transaccion->esBanco = TRUE;
					$transaccion->fechaTransaccion = $fechaTransaccion;
					$transaccion->montoTransaccion = $montoTransaccion;
					$transaccion->haber = $montoTransaccion;
					$transaccion->saldoCuenta = $cuentaCaja->saldo;
					$descripcion = "Comision  " . $porcentaje . " BsF";
					$transaccion->descripcion = $descripcion;
					$transaccion->tipoTransaccion = $tipoTransaccion;
					$transaccion->cuentaCaja = $cuentaCaja;
					$transaccion->commit();
					$facade->session->evictAll('MTransaccion');
				}
				if ($porcentaje = $tipoTransaccion->porcentajeImpuesto > 0) {
					$montoNuevo = $montoPagado * $porcentaje / 100;
					$montoImpuesto -= $montoNuevo;
					$transaccion = $session->create('MTransaccion');
					$fechaTransaccion = time();
					$montoTransaccion = $montoNuevo;
					$transaccion->esBanco = TRUE;
					$transaccion->fechaTransaccion = $fechaTransaccion;
					$transaccion->montoTransaccion = $montoTransaccion;
					$transaccion->haber = $montoTransaccion;
					$transaccion->saldoCuenta = $cuentaCaja->saldo;
					$descripcion = "Impuesto " . $porcentaje . " %";
					$transaccion->descripcion = $descripcion;
					$transaccion->tipoTransaccion = $tipoTransaccion;
					$transaccion->cuentaCaja = $cuentaCaja;
					$transaccion->commit();
					$facade->session->evictAll('MTransaccion');
				}
				if ($porcentaje = $tipoTransaccion->montoImpuesto > 0) {
					$montoImpuesto -= $porcentaje;
					$transaccion = $session->create('MTransaccion');
					$fechaTransaccion = time();
					$montoTransaccion = $porcentaje;
					$transaccion->esBanco = TRUE;
					$transaccion->fechaTransaccion = $fechaTransaccion;
					$transaccion->montoTransaccion = $montoTransaccion;
					$transaccion->haber = $montoTransaccion;
					$transaccion->saldoCuenta = $cuentaCaja->saldo;
					$descripcion = "Impuesto " . $porcentaje . " BsF";
					$transaccion->descripcion = $descripcion;
					$transaccion->tipoTransaccion = $tipoTransaccion;
					$transaccion->cuentaCaja = $cuentaCaja;
					$transaccion->commit();
					$facade->session->evictAll('MTransaccion');
				}
				$transaccion = $session->create('MTransaccion');
				$fechaTransaccion = time();
				$montoTransaccion = $montoPagado + $montoImpuesto;
				$transaccion->esBanco = TRUE;
				$transaccion->fechaTransaccion = $fechaTransaccion;
				$transaccion->montoTransaccion = $montoTransaccion;
				$transaccion->haber = $montoTransaccion;
				
				if (strlen($formaP->detalle) > 0)
					$detalle =$formaP->detalle;
				else
					$detalle = " con " . $formaP->formaPago->nombre . " " . $formaP->detalle;
				$descripcion = "Pago Prestamo " . $docFP->documento->numero . $detalle;
				$transaccion->descripcion = $descripcion;
				$transaccion->tipoTransaccion = $tipoTransaccion;
				$transaccion->cuentaBanco = $cuentaCaja;
				$transaccion->documento = $docFC;
				$saldoCajaNuevo = $saldoCajaViejo - $montoPagado + $montoImpuesto;
				$cuentaCaja->saldo = $saldoCajaNuevo;
				$transaccion->saldoCuenta = $cuentaCaja->saldo;
			}
			$transaccion->commit();
			$cuentaCaja->commit();
			$numero++;
		}
		/******************* Actualizo las cuentas por cobrar ********************************/
		$cuentaPorCobrar = $docFC->cuentas[$docFC->cuentaAfectar];
		$cuentaPorCobrar->aumenta($docFC->montoTotal, $docFC, null, null);
		$cuentaPorCobrar->commit();
		$numero = 0;
		for ($i = 1; $i <= $plazos; $i++) {
			$montoGiroCuota = $docFC->montoTotal / $docFC->plazos;
			$numero++;
			$fechaVencimiento = $docFC->fecha + $numero * 3600 * 24 * 30;
			if ($docFC->tieneGiro) {
				$docGC = $session->create('DGiroCliente');
				$docGC->prestamoAExterno = $docFC;
				$docGC->numeroGiro = $numero;
				$docGC->cuentaCliente = $cuentaCliente;
				$docGC->fechaTransaccion = time();
				$docGC->fechaVencimiento = $fechaVencimiento;
				$docGC->montoGiro = $montoGiroCuota;
				$docGC->cliente = $docFC->cliente;
				/******************* Actualizo la cuenta cliente *************************************/
				$cuentaCliente->saldo -= $montoGiroCuota;
				$cuentaCliente->giroCliente[] = $docGC;
				
				//se crea la clase ke lleva el historico del saldo y documento que afecto la cta cliente... carlos
				$historico = $session->create('MListaHistoricoCuentas');
				$historico->fecha = date('U');
				$historico->saldo = $cuentaCliente->saldo;
				$historico->referencia = $docGC->numero;
				$historico->cuentaCliente = $cuentaCliente;				
				$historico->commit();
				
				$cuentaCliente->historico[] = $historico;
				$cuentaCliente->commit();
				/*************************************************************************************/
				$role = NULL;
				$usuario = $docFC->usuario;
				$IdDep = $usuario->empleado->departamento->identificadorUnico;
				//echo "<hr>usuario: ",$usuario;
				$departamento = $usuario->empleado->departamento;
				$newEfacade = & EFacade :: initWorkflow($facade->session, $docGC, & $role);
				$transSetOT = & EFacade :: getCurrentTransSetAuto($newEfacade->getWorkflow(), /* PROCESS */3);
				$placeSet = EFacade :: getCurrentPlaceSet($newEfacade->getWorkflow());
				//echo "<hr>placeset: ",$placeSet;
				$dptoVarietyList = $placeSet->dptoVarietyList;
				foreach ($dptoVarietyList as $d) {
					if ($d->dptoName == $IdDep) {
						//echo '<br>paso por aki';
						$docGC->departamento = $departamento;
						$docGC->variante = $d->variantList[0];
					}
				}
				$transOT = $transSetOT->getTransByName('t1');
				$usuario = NULL;
				$newEfacade->fireTrans($transOT, $usuario, "Crear", TRUE);
				$docGC->epSetDirty(TRUE);
				$newEfacade->saveWorkflow();
				$docGC->diferenciador = $docGC->getDocumentDifer();
				$docGC->commit();
				$docGC->numero = $docGC->getDocumentNumber();
				$docGC->diferenciador = $docGC->getDocumentDifer();
				$docGC->commit();
				
				$historico->referencia = $docGC->numero;				
				$historico->commit();
				
				$cuentaCliente->historico[] = $historico;
				$cuentaCliente->commit();
				
				unset ($newEfacade);
				$facade->session->evictAll('MEdge');
				$facade->session->evictAll('MTrans');
				$facade->session->evictAll('MPlace');
			} else {
				$cuota = $session->create('MCuotaCliente');
				$cuota->fechaVencimiento = $fechaVencimiento;
				$cuota->montoCuota = $montoGiroCuota;
				$cuota->refFactura = $docFC->numero." - ".$docFC->conceptoPrestamo." - Cuota ".$numero."/".$docFC->plazos." - vence: ".dateToString($fechaVencimiento);
				$cuota->status = FALSE;
				$cuota->prestamoAExterno = $docFC;
				$cuota->cliente = $docFC->cliente;
				$cuota->commit();
				/******************* Actualizo la cuenta cliente *************************************/
				$cuentaCliente->saldo -= $montoGiroCuota;
				$cuentaCliente->cuotasCliente[] = $cuota;
				
				//se crea la clase ke lleva el historico del saldo y documento que afecto la cta cliente... carlos
				$historico = $session->create('MListaHistoricoCuentas');
				$historico->fecha = date('U');
				$historico->saldo = $cuentaCliente->saldo;
				$historico->referencia = $docFC->numero;				
				$historico->commit();
				
				$cuentaCliente->historico[] = $historico;
				$cuentaCliente->commit();
				/*************************************************************************************/

			}
		}
		$workflowFC = & $docFC->getWorkflowRef();
		$facade->session->refresh($workflowFC);
		$transSetFC = & EFacade :: getCurrentTransSetAuto($workflowFC, /* AGENT */2);
		$transFC = & $transSetFC->getTransByName('t2');
		$user = NULL;
		$facade->fireTrans($transFC, $user, 'Generar Cuota o Giro', FALSE);
		$workflowFC->epSetDirty(TRUE);
		$docFC->epSetDirty(TRUE);
		$facade->saveWorkflow();
	}

	public function culminar(EFacade & $facade) {
		$ezpdo_=getManager();
		$ezpdo_->evictAll('MCuotaCliente');
		$session=$facade->session;
		$docFC = & $facade->getDocumentRoot();
		$termino = true;
		foreach($docFC->giroCliente as $gir){
			$placeSet = & EFacade :: getCurrentPlaceSet($gir->workflowRef);
			if($placeSet->name!='ps5'){//culminado en totalidad
				$termino = false;
				break;
			}	
		}
		foreach($docFC->cuotaCliente as $cuo)
			if(!$cuo->status){
				$termino = false;
				break;
			}
		$wf = $docFC->workflowRef;
		$transet = & EFacade :: getCurrentTransSetAuto($wf, /* AGENT */2);
		if($termino)
			$trans = & $transet->getTransByName('t4');
		else
			$trans = & $transet->getTransByName('t5');
		$user = NULL;
		$facade->fireTrans($trans, $user, 'Agente', FALSE);		
	}
}
?>